#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
using namespace std;

struct stgirl // 超女结构体
{
    int no;   // 编号
    char name[51];  // 姓名，注意：不能用string
};

int main(int argc, char* argv[])
{
    if (argc!=3){
        cout << "Using: ./demo no name" << endl;
        return -1;
    }

    // 第1步：创建/获取共享内存，键key为0x5005,也可以用其他值
    int shmid = shmget(0x5005, sizeof(stgirl), 0640|IPC_CREAT);
    // int shmid = shmget(1000, sizeof(stgirl), 0640|IPC_CREAT);  //用10进制作为key所见不容易分别

    if(shmid==-1){
        cout << "shmget(0x5005) failed" << endl;
        return -1;
    }

    cout << "shmid = " << shmid << endl;

    // 第2步，把共享内存链接到当前进程的地址空间
    stgirl* ptr = (stgirl *) shmat(shmid, 0, 0);
    if (ptr == (void *)-1){  // 注意这里不能用-1，需要转化为指针
        cout << "shmat() failed" << endl;
        return -1;
    }

    // 第3步：使用共享内存，对共享内存进行读写
    cout << "原值：no=" << ptr->no << " ，ame=" << ptr->name << endl;  // 显示共享内存的原值
    // 将新值写入共享内存
    ptr->no = atoi(argv[1]);  //对超女结构体的no赋值
    strcpy(ptr->name, argv[2]); // 对超女结构体的name赋值
    // ptr->name = argv[2];
    cout << "新值：no=" << ptr->no << " ，ame=" << ptr->name << endl;  // 显示共享内存的当前值

    // 第4步：把共享内存从当前进程分离
    shmdt(ptr);

    // 第5步：删除共享内存（都不用的时候删除）
    if (shmctl(shmid, IPC_RMID, 0) == -1)
    {
        cout << "shmctl failed" << endl;
        return -1;
    }
}